home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / exe / wndproc.c < prev   
C/C++ Source or Header  |  2004-03-16  |  8KB  |  330 lines

  1. /*-------------------------------------------------------------
  2.   wndproc.c : window procedure of tclock.exe
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tclock.h"
  10.  
  11. /* Globals */
  12.  
  13. LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
  14.     WPARAM wParam, LPARAM lParam);
  15. HWND g_hwndClock = NULL; // clock window
  16.  
  17. /* Statics */
  18.  
  19. static void OnCreate(HWND hwnd);
  20. static void OnDestroy(HWND hwnd);
  21. static void ClearTClockMain(HWND hwnd);
  22. static void OnTimerStart(HWND hwnd);
  23. static void OnTimerMain(HWND hwnd);
  24. static void OnTCMHwndClock(HWND hwnd, LPARAM lParam);
  25. static void OnTCMClockError(HWND hwnd, LPARAM lParam);
  26. static void OnTCMExit(HWND hwnd);
  27. static void OnTCMReloadSetting(HWND hwnd);
  28. static void OnTaskbarRestart(HWND hwnd);
  29. static void OnCopyData(HWND hwnd, HWND hwndFrom, COPYDATASTRUCT* pcds);
  30. static void InitError(int n);
  31.  
  32. static BOOL m_bHook = FALSE;
  33. static BOOL m_bStartTimer = FALSE;
  34.  
  35.  
  36. /*-------------------------------------------
  37.    the window procedure
  38. ---------------------------------------------*/
  39. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  40. {
  41.     switch (message)
  42.     {
  43.         case WM_CREATE:
  44.             OnCreate(hwnd);
  45.             return 0;
  46.         case WM_DESTROY:
  47.             OnDestroy(hwnd);
  48.             return 0;
  49.         case WM_ENDSESSION:
  50.             if(wParam) ClearTClockMain(hwnd);
  51.             break;
  52.         
  53.         case WM_TIMER:
  54.             switch (wParam)
  55.             {
  56.                 case IDTIMER_START:
  57.                     OnTimerStart(hwnd); break;
  58.                 case IDTIMER_MAIN:
  59.                     OnTimerMain(hwnd);  break;
  60.                 case IDTIMER_MOUSE:
  61.                     // mouse.c
  62.                     OnTimerMouse(hwnd); break;
  63.                 case IDTIMER_MONOFF:
  64.                     KillTimer(hwnd, wParam);
  65.                     SendMessage(GetDesktopWindow(), WM_SYSCOMMAND,
  66.                         SC_MONITORPOWER, 2);
  67.                     break;
  68.             }
  69.             return 0;
  70.         
  71.         // menu and commands
  72.         case WM_COMMAND:
  73.             // command.c
  74.             OnTClockCommand(hwnd, LOWORD(wParam), HIWORD(wParam));
  75.             return 0;
  76.         case WM_CONTEXTMENU:
  77.             // menu.c
  78.             OnContextMenu(hwnd, (HWND)wParam, LOWORD(lParam), HIWORD(lParam));
  79.             return 0;
  80.         case WM_EXITMENULOOP:
  81.             // menu.c
  82.             OnExitMenuLoop(hwnd);
  83.             return 0;
  84.         
  85.         // messages sent/posted from other programs
  86.         
  87.         case TCM_HWNDCLOCK:
  88.             OnTCMHwndClock(hwnd, lParam);
  89.             return 0;
  90.         case TCM_CLOCKERROR:
  91.             OnTCMClockError(hwnd, lParam);
  92.             return 0;
  93.         case TCM_EXIT:
  94.             OnTCMExit(hwnd);
  95.             return 0;
  96.         case TCM_RELOADSETTING:
  97.             OnTCMReloadSetting(hwnd);
  98.             return 0;
  99.         // case TCM_REQUESTSNTPLOG:
  100.         //    // sntp.c
  101.         //    OnTCMRequestSNTPLog(hwnd, (HWND)wParam);
  102.         //    return 0;
  103.         
  104.         case WM_COPYDATA:
  105.             OnCopyData(hwnd, (HWND)wParam, (COPYDATASTRUCT*)lParam);
  106.             return 0;
  107.         
  108.         case MM_MCINOTIFY:
  109.             // common/playfile.c
  110.             OnMCINotify(hwnd, wParam, (LONG)lParam);
  111.             return 0;
  112.         case MM_WOM_DONE: // stop playing wave
  113.         case TCM_STOPSOUND:
  114.             StopFile();
  115.             return 0;
  116.         
  117.         /* -------- mouse ---------- */
  118.         
  119.         case WM_DROPFILES:
  120.             OnDropFiles(hwnd, (HDROP)wParam); // mouse2.c
  121.             return 0;
  122.         
  123.         case WM_MOUSEWHEEL:
  124.             OnMouseWheel(hwnd, wParam, lParam); // mouse2.c
  125.             return 0;
  126.         
  127.         case WM_LBUTTONDOWN:
  128.         case WM_RBUTTONDOWN:
  129.         case WM_MBUTTONDOWN:
  130.         case WM_XBUTTONDOWN:
  131.             StopFile();
  132.             OnMouseDown(hwnd, message, wParam, lParam); // mouse.c
  133.             return 0;
  134.         case WM_LBUTTONUP:
  135.         case WM_RBUTTONUP:
  136.         case WM_MBUTTONUP:
  137.         case WM_XBUTTONUP:
  138.             OnMouseUp(hwnd, message, wParam, lParam); // mouse.c
  139.             return 0;
  140.     }
  141.     
  142.     if(message == g_uTaskbarRestart)
  143.         OnTaskbarRestart(hwnd);
  144.     
  145.     return DefWindowProc(hwnd, message, wParam, lParam);
  146. }
  147.  
  148. /* ------------------------------- Statics -------------------------------- */
  149.  
  150. /*-------------------------------------------------------
  151.   WM_CREATE message
  152. ---------------------------------------------------------*/
  153. void OnCreate(HWND hwnd)
  154. {
  155.     int nDelay;
  156.     
  157.     InitAlarm();  // alarm.c
  158.     InitMouseFunction(hwnd); // mouse.c
  159.     // InitSNTP(hwnd); // sntp.c
  160.     
  161.     // delay starting
  162.     nDelay = GetMyRegLong(NULL, "DelayStart", 0);
  163.     if(nDelay > 0)
  164.     {
  165.         SetTimer(hwnd, IDTIMER_START, nDelay * 1000, NULL);
  166.         m_bStartTimer = TRUE;
  167.     }
  168.     else OnTimerStart(hwnd);
  169.     
  170.     SetTimer(hwnd, IDTIMER_MAIN, 1000, NULL);
  171. }
  172.  
  173. /*-------------------------------------------------------
  174.   WM_DESTROY message
  175. ---------------------------------------------------------*/
  176. void OnDestroy(HWND hwnd)
  177. {
  178.     ClearTClockMain(hwnd);
  179.     
  180.     PostQuitMessage(0);
  181. }
  182.  
  183. /*-------------------------------------------------------
  184.   clear up
  185. ---------------------------------------------------------*/
  186. void ClearTClockMain(HWND hwnd)
  187. {
  188.     static BOOL bCleared = FALSE;
  189.     
  190.     if(bCleared) return;
  191.     bCleared = TRUE;
  192.     
  193.     if(g_hDlgAbout && IsWindow(g_hDlgAbout))
  194.         DestroyWindow(g_hDlgAbout);
  195.     
  196.     // EndSNTP(hwnd);
  197.     StopFile();
  198.     EndMouseFunction(hwnd);
  199.     EndAlarm();
  200.     EndMenu();
  201.     
  202.     KillTimer(hwnd, IDTIMER_MAIN);
  203.     
  204.     if(m_bStartTimer) KillTimer(hwnd, IDTIMER_START);
  205.     m_bStartTimer = FALSE;
  206.     
  207.     if(m_bHook) HookEnd();  // dll/main.c - uninstall the hook
  208.     m_bHook = FALSE;
  209. }
  210.  
  211. /*-------------------------------------------------------
  212.   WM_TIMER message, wParam = IDTIMER_START
  213.   start customizing the tray clock
  214. ---------------------------------------------------------*/
  215. void OnTimerStart(HWND hwnd)
  216. {
  217.     if(m_bStartTimer) KillTimer(hwnd, IDTIMER_START);
  218.     m_bStartTimer = FALSE;
  219.     if(!m_bHook)
  220.         m_bHook = HookStart(hwnd); // dll/main.c - install a hook
  221.     
  222.     OnTimerAlarm(hwnd, NULL, 1); // alarm.c
  223. }
  224.  
  225. /*-------------------------------------------------------
  226.   WM_TIMER message, wParam = IDTIMER_MAIN
  227. ---------------------------------------------------------*/
  228. void OnTimerMain(HWND hwnd)
  229. {
  230.     static BOOL bTimerAdjusting = FALSE;
  231.     SYSTEMTIME st;
  232.     
  233.     GetLocalTime(&st);
  234.     
  235.     // adjusting milliseconds gap
  236.     if((st.wMilliseconds > 200 ||
  237.         ((g_winver | WINNT) && st.wMilliseconds > 50)))
  238.     {
  239.         KillTimer(hwnd, IDTIMER_MAIN);
  240.         SetTimer(hwnd, IDTIMER_MAIN, 1001 - st.wMilliseconds, NULL);
  241.         bTimerAdjusting = TRUE;
  242.     }
  243.     else if(bTimerAdjusting)
  244.     {
  245.         KillTimer(hwnd, IDTIMER_MAIN);
  246.         bTimerAdjusting = FALSE;
  247.         SetTimer(hwnd, IDTIMER_MAIN, 1000, NULL);
  248.     }
  249.     
  250.     OnTimerAlarm(hwnd, &st, 0); // alarm.c
  251.     
  252.     // OnTimerSNTP(hwnd);  // sntp.c
  253. }
  254.  
  255. /*-------------------------------------------------------
  256.   TCM_HWNDCLOCK message
  257. ---------------------------------------------------------*/
  258. void OnTCMHwndClock(HWND hwnd, LPARAM lParam)
  259. {
  260.     g_hwndClock = (HWND)lParam;
  261. }
  262.  
  263. /*-------------------------------------------------------
  264.   TCM_CLOCKERROR message
  265. ---------------------------------------------------------*/
  266. void OnTCMClockError(HWND hwnd, LPARAM lParam)
  267. {
  268.     char s[160];
  269.     
  270.     wsprintf(s, "%s: %d", "failed to start TClock.", lParam);
  271.     MessageBox(NULL, s, "Error", MB_OK|MB_ICONEXCLAMATION);
  272.     
  273.     PostMessage(hwnd, WM_CLOSE, 0, 0);
  274. }
  275.  
  276. /*-------------------------------------------------------
  277.   TCM_EXIT message
  278. ---------------------------------------------------------*/
  279. void OnTCMExit(HWND hwnd)
  280. {
  281.     if(g_hwndClock)
  282.         PostMessage(g_hwndClock, CLOCKM_EXIT, 0, 0);
  283. }
  284.  
  285. /*-------------------------------------------------------
  286.   TCM_RELOADSETTING message
  287. ---------------------------------------------------------*/
  288. void OnTCMReloadSetting(HWND hwnd)
  289. {
  290.     InitAlarm(); // alarm.c
  291.     InitMouseFunction(hwnd); // mouse.c
  292. }
  293.  
  294. /*-------------------------------------------------------
  295.   When Explorer is hung up,
  296.   and the taskbar is recreated.
  297. ---------------------------------------------------------*/
  298. void OnTaskbarRestart(HWND hwnd)
  299. {
  300.     if(m_bHook) HookEnd();
  301.     m_bHook = FALSE; g_hwndClock = NULL;
  302.     
  303.     if(GetMyRegLong(NULL, "TaskbarRestart", FALSE))
  304.     {
  305.         SetTimer(hwnd, IDTIMER_START, 1000, NULL);
  306.         m_bStartTimer = TRUE;
  307.     }
  308.     else
  309.         PostMessage(hwnd, WM_CLOSE, 0, 0);
  310. }
  311.  
  312. /*-------------------------------------------------------
  313.   WM_COPYDATA message
  314. ---------------------------------------------------------*/
  315. void OnCopyData(HWND hwnd, HWND hwndFrom, COPYDATASTRUCT* pcds)
  316. {
  317.     const char *p = (char *)pcds->lpData;
  318.     
  319.     switch(pcds->dwData)
  320.     {
  321.         case COPYDATA_SOUND:
  322.             PlayFileCmdLine(hwnd, p);  // common/playfile.c
  323.             break;
  324.         case COPYDATA_EXEC:
  325.             ExecCommandString(hwnd, p);  // command.c
  326.             break;
  327.     }
  328. }
  329.  
  330.